﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using SIM.Geo.BE;
using System.Linq;

namespace SIM.Geo.DA
{
    public class DAUsuario : Base
    {
        #region Metodos
        /// <summary>
        /// Método que devuelve la lista de Usuario
        /// </summary>
        /// <returns></returns>
        public List<Usuario> ListarUsuario()
        {
            return this.Context.Usuario.ToList();
        }
        /// <summary>
        /// Método para insertar una Usuario
        /// </summary>
        /// <param name="Usuario"></param>
        /// <returns></returns>
        public string InsertarUsuario(Usuario usuario)
        {
            this.Context.Usuario.AddObject(usuario);
            this.Context.SaveChanges();
            return usuario.CodigoUsuario;
        }
        /// <summary>
        /// Método para modificar un Usuario
        /// </summary>
        /// <param name="Usuario"></param>
        public void ModificarUsuario(Usuario usuario)
        {
            this.Context.Usuario.Attach(usuario);
            this.Context.ObjectStateManager.ChangeObjectState(usuario, EntityState.Modified);
            this.Context.SaveChanges();
        }
        /// <summary>
        /// Método para eliminar Usuario
        /// </summary>
        /// <param name="Usuario"></param>
        public void EliminarUsuario(Usuario usuario)
        {
            this.Context.Usuario.DeleteObject(usuario);
            this.Context.SaveChanges();
        }
        /// <summary>
        /// Método que busca por nombre Usuario
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<Usuario> BuscarUsuario(string nombre)
        {
            return this.Context.Usuario.Where(x => x.NombreUsuario.StartsWith(nombre)).ToList();
        }
        /// <summary>
        /// Método que devuelve Usuario por codigo
        /// </summary>
        /// <param name="codigoUsuario"></param>
        /// <returns></returns>
        public Usuario ObtenerUsuario(string codigoUsuario)
        {
            return this.Context.Usuario.Where(x => x.CodigoUsuario.ToUpper().Equals(codigoUsuario.ToUpper())).FirstOrDefault();
        }
        /// <summary>
        /// Método que devuelve Usuario por codigo
        /// </summary>
        /// <param name="codigoUsuario"></param>
        /// <returns></returns>
        public UsuarioResponse ObtenerUsuarioPerfil(string codigoUsuario, int codigoPerfil)
        {
            UsuarioResponse usuarioResponse = null;
            usuarioResponse = this.Context.UsuarioPerfil.Where(x => x.CodigoUsuario.Equals(codigoUsuario) && x.CodigoPerfil.Equals(codigoPerfil))
                .Select(x => new UsuarioResponse
                {
                    CodigoUsuario = x.CodigoUsuario,
                    NombreUsuario = x.Usuario.NombreUsuario,
                    CodigoPerfil = x.CodigoPerfil,
                    NombrePerfil = x.Perfil.Descripcion,
                    CodigoTrabajador = x.Usuario.CodigoTrabajador,
                })
                .FirstOrDefault();

            return usuarioResponse;
        }

        /// <summary>
        /// Devuelve la lista de perfiles por usuario
        /// </summary>
        /// <param name="codigoUsuario"></param>
        /// <returns></returns>
        public List<PerfilResponse> ListarPerfilesPorUsuario(string codigoUsuario)
        {
            List<PerfilResponse> listaperfiles = null;
            listaperfiles = this.Context.UsuarioPerfil.Where(x => x.CodigoUsuario.Equals(codigoUsuario))
                    .Select(x => new PerfilResponse
                    {
                        CodigoPerfil = x.CodigoPerfil,
                        Descripcion = x.Perfil.Descripcion,
                    }).Distinct().ToList();
            return listaperfiles;
        }
        #endregion
    }
}
